#include "feixe.h"

bool compara_distancia(int um, int dois)
{
    float mDistancias[8];
    mDistancias[0] = 20.0;
    mDistancias[1] = 10.4;
    mDistancias[2] = 8.9;
    mDistancias[3] = 6.7;
    mDistancias[4] = 6.9;
    mDistancias[5] = 4.0;
    mDistancias[6] = 3.0;
    mDistancias[7] = 0.0;

    return ( mDistancias[um] < mDistancias[dois] )? true: false;
}

Feixe::Feixe()
{
}

Feixe::Feixe(int i, int j)
{
    this->mInicio = i;
    this->mFim = j;
    this->mGrafo = new MatrizAdjacencia();
    this->mGrafo->constroi();
    this->w = 2;
}

void Feixe::retornaCaminho()
{
    this->mFila1.push_back(this->mInicio);
    int indiceAtual = this->mInicio;
    int indicePai;
    int* filhosAtuais;

    std::cout << "Feixe Caminho: ";

    while ( !this->mFila1.empty() && indiceAtual != this->mFim )
    {
        while( !this->mFila1.empty() && indiceAtual != this->mFim )
        {
            indiceAtual = this->mFila1.front();
            std::cout << indiceAtual;
            this->mFila1.pop_front();

            if (indiceAtual != this->mFim)
            {
                std::cout << " -> ";
            }

            filhosAtuais = this->mGrafo->getFilhos(indiceAtual);
            for ( int i = 0; i < this->mGrafo->getNumVertices(); i++ )
            {
                if(filhosAtuais[i] != 0)
                {
                    this->mFila2.push_back(i);
                }
            }
        }

        this->mFila2.sort(compara_distancia);

        while( this->mFila2.size() > this->w )
        {
            this->mFila2.pop_back();
        }
        this->mFila1.clear();
        this->mFila1.splice(this->mFila1.begin(), this->mFila2);
    }

    std::cout << std::endl;
}
